:root{--ink:#1a1a18;--ink-mid:#4a4a44;--ink-light:#8a8a82;--paper:#f8f4ec;--paper-mid:#ede8dc;--paper-dark:#ccc8bc;--red:#c8392b;--gold:#b8860b;--green:#2d6a2d;--blue:#1a5fcc;--orange:#d4730a;--teal:#20B2AA;} body{font-family:'IBM Plex Sans',sans-serif;background:var(--paper);color:var(--ink);min-height:100vh} .masthead{background:var(--ink);color:var(--paper);border-bottom:4px solid var(--red);position:sticky;top:0;z-index:200} .masthead-inner{max-width:1400px;margin:0 auto;padding:10px 20px 8px;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px} .masthead-left{display:flex;flex-direction:column;gap:2px} .live-badge{display:inline-flex;align-items:center;gap:5px;font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:rgba(248,244,236,.5)} .live-dot{width:6px;height:6px;border-radius:50%;background:#4caf50;animation:pulse 2s infinite} @keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}} .masthead-date{font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.08em;color:rgba(248,244,236,.4);text-transform:uppercase} .site-name{font-family:'Cinzel',serif;font-size:clamp(18px,2.8vw,28px);font-weight:700;letter-spacing:.02em;color:var(--paper);line-height:1;white-space:nowrap;text-align:center} .site-tagline{font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.15em;text-transform:uppercase;color:rgba(248,244,236,.45);margin-top:3px;text-align:center} .masthead-right{text-align:right;font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:rgba(248,244,236,.4)} .legend{background:var(--red);padding:5px 20px;display:flex;gap:16px;flex-wrap:wrap;align-items:center} .leg{display:flex;align-items:center;gap:4px;font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.05em;color:rgba(255,255,255,.95);white-space:nowrap} .leg-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0} .region-bar{background:var(--paper-mid);border-bottom:1px solid var(--paper-dark);padding:8px 20px;display:flex;gap:6px;flex-wrap:wrap;align-items:center;position:sticky;top:72px;z-index:100} .rl{font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-light);margin-right:4px;flex-shrink:0} .rbtn{border:1px solid var(--paper-dark);background:var(--paper);color:var(--ink-mid);font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.06em;text-transform:uppercase;padding:5px 10px;cursor:pointer;border-radius:3px;transition:all .12s;white-space:nowrap} .rbtn:hover,.rbtn.on{background:var(--ink);color:var(--paper);border-color:var(--ink)} .flag-section{padding:16px 20px;border-bottom:1px solid var(--paper-dark)} .flag-grid{display:flex;flex-wrap:wrap;gap:10px} .fc{display:flex;flex-direction:column;align-items:center;gap:4px;cursor:pointer;padding:8px 6px 6px;border-radius:4px;border:1.5px solid transparent;transition:all .15s;min-width:62px;max-width:70px;background:white;position:relative;user-select:none} .fc:hover{border-color:var(--ink-mid);transform:translateY(-2px);box-shadow:0 4px 12px rgba(26,26,24,.12)} .fc.on{border-color:var(--red);box-shadow:0 4px 12px rgba(200,57,43,.2)} .fe{font-size:26px;line-height:1;display:block} .fn{font-family:'IBM Plex Mono',monospace;font-size:7px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-mid);text-align:center;line-height:1.25;word-break:break-word} .fc.on .fn{color:var(--red);font-weight:500} .sbadge{position:absolute;top:2px;right:3px;font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--orange);font-weight:700;line-height:1} .main-wrap{max-width:1400px;margin:0 auto;padding:28px 20px 60px;display:grid;grid-template-columns:300px 1fr;gap:28px;align-items:start} @media(max-width:900px){.main-wrap{grid-template-columns:1fr}.cpanel{position:static!important}} .cpanel{background:white;border:1px solid var(--paper-dark);border-radius:4px;overflow:hidden;position:sticky;top:128px} .cp-flag{font-size:56px;line-height:1;display:block;text-align:center;padding:20px 0 8px} .cp-name{font-family:'Playfair Display',serif;font-size:22px;font-weight:700;text-align:center;padding:0 16px;line-height:1.2} .cp-outlets{display:flex;gap:8px;padding:8px 12px;justify-content:center;flex-wrap:wrap} .outlet-btn{flex:1;min-width:110px;padding:10px 12px;border:1px solid var(--paper-dark);background:var(--paper);color:var(--ink-mid);font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.06em;text-transform:uppercase;cursor:pointer;border-radius:3px;transition:all .12s;text-align:center;line-height:1.4} .outlet-btn:hover{border-color:var(--blue);color:var(--ink)} .outlet-btn.active{background:var(--ink);color:var(--paper);border-color:var(--ink)} .outlet-btn a{display:block;font-size:11px;font-family:'IBM Plex Sans',sans-serif;font-weight:500;letter-spacing:0;text-transform:none;color:var(--blue);text-decoration:underline;margin-top:4px} .outlet-btn.active a{color:rgba(248,244,236,.7);text-decoration:underline} .outlet-btn a:hover{color:var(--teal)} .cp-tags{display:flex;flex-wrap:wrap;gap:5px;padding:6px 16px;justify-content:center} .tag{font-family:'IBM Plex Mono',monospace;font-size:8px;letter-spacing:.07em;text-transform:uppercase;padding:3px 8px;border-radius:3px;display:inline-block} .tag-state{background:#fff8e6;color:var(--orange);border:1px solid #f5d9a0} .tag-free{background:#e8f5e8;color:var(--green);border:1px solid #b8dab8} .tag-partial{background:#fff3e0;color:var(--orange);border:1px solid #f5c97a} .tag-tr{background:#e8f0fe;color:var(--blue);border:1px solid #a8c4f8} .cp-note{margin:0 12px 12px;background:#fff8e6;border:1px solid #f0c040;border-left:3px solid var(--gold);padding:10px 12px;border-radius:0;font-size:11px;color:#5a4a0a;line-height:1.55} .cp-stats{border-top:1px solid var(--paper-mid);padding:12px 16px;display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;text-align:center} .sv{font-family:'Playfair Display',serif;font-size:18px;font-weight:700;display:block} .sl{font-family:'IBM Plex Mono',monospace;font-size:8px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-light)} .cp-welcome{padding:24px 20px;text-align:center} .cw-globe{font-size:48px;display:block;margin-bottom:12px} .cw-title{font-family:'Playfair Display',serif;font-size:18px;font-weight:400;margin-bottom:8px} .cw-body{font-size:12px;color:var(--ink-light);line-height:1.65} .articles-area{min-height:400px} .art-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid var(--ink)} .art-title{font-family:'Playfair Display',serif;font-size:22px;font-weight:700} .art-meta{font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-light)} .ref-btn{background:none;border:1px solid var(--paper-dark);color:var(--ink-mid);font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.08em;text-transform:uppercase;padding:5px 10px;cursor:pointer;border-radius:3px;transition:all .12s} .ref-btn:hover{border-color:var(--red);color:var(--red)} .arts-list{display:flex;flex-direction:column;gap:16px} .acard{background:white;border:1px solid var(--paper-dark);border-radius:4px;overflow:hidden;transition:box-shadow .15s} .acard:hover{box-shadow:0 4px 20px rgba(26,26,24,.1)} .ac-hdr{background:var(--ink);padding:4px 14px;display:flex;align-items:center;justify-content:space-between} .ac-num{font-family:'Playfair Display',serif;font-size:10px;font-style:italic;color:rgba(248,244,236,.7)} .ac-src{font-family:'IBM Plex Mono',monospace;font-size:8px;letter-spacing:.1em;text-transform:uppercase;color:rgba(248,244,236,.5);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .ac-body{padding:14px} .ac-date{font-family:'IBM Plex Mono',monospace;font-size:8.5px;color:var(--ink-light);margin-bottom:8px} .ac-hl{font-family:'Playfair Display',serif;font-size:20px;font-weight:700;line-height:1.28;margin-bottom:8px} .ac-hl a{color:var(--ink);text-decoration:none;transition:color .12s} .ac-hl a:hover{color:var(--red)} .ac-desc{font-size:13px;color:var(--ink-mid);line-height:1.7;padding-top:10px;border-top:1px solid var(--paper-mid)} .ac-link{display:inline-flex;align-items:center;gap:4px;margin-top:10px;font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--red);text-decoration:none;border-bottom:1px solid var(--red);padding-bottom:1px} .ac-link:hover{opacity:.7} .ac-tr{display:inline-flex;align-items:center;gap:4px;margin-top:8px;margin-left:12px;font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:var(--blue);text-decoration:none;border-bottom:1px solid var(--blue);padding-bottom:1px} .loading{text-align:center;padding:60px 20px} .spinner{width:32px;height:32px;border:2px solid var(--paper-dark);border-top-color:var(--red);border-radius:50%;animation:spin .7s linear infinite;margin:0 auto 14px} @keyframes spin{to{transform:rotate(360deg)}} .lt{font-family:'IBM Plex Mono',monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-light)} .lc{font-family:'Playfair Display',serif;font-size:18px;margin-top:5px} .err{background:#fff5f5;border:1px solid #fcc;border-left:3px solid var(--red);padding:14px 18px;border-radius:3px;font-size:13px;color:#7a2020;line-height:1.65} .err a{color:var(--red)} .welcome-state{text-align:center;padding:80px 20px} .wg{font-size:64px;display:block;margin-bottom:20px} .wt{font-family:'Playfair Display',serif;font-size:26px;font-weight:400;margin-bottom:10px} .wb{font-size:14px;color:var(--ink-light);max-width:480px;margin:0 auto;line-height:1.7} .site-footer{border-top:3px double var(--paper-dark);background:var(--paper-mid);padding:28px 24px 24px} .footer-top{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:20px;flex-wrap:wrap} .footer-links{display:flex;gap:18px;flex-wrap:wrap} .footer-links a{color:var(--ink-light);font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.08em;text-transform:uppercase;text-decoration:none;transition:color .12s} .footer-links a:hover{color:var(--teal)} .footer-hr{border:none;border-top:0.5px solid var(--paper-dark);margin:0 0 24px} .footer-bottom{display:flex;flex-direction:column;align-items:center;gap:12px} .marks-row{display:flex;align-items:center;justify-content:center} .mark-divider{width:.75px;height:52px;background:var(--paper-dark);margin:0 32px;flex-shrink:0} .rubimby-btn{display:flex;flex-direction:column;align-items:center;gap:3px;cursor:pointer;transition:opacity .15s;border:none;background:none;padding:0} .rubimby-btn:hover{opacity:.72} .r-word{font-family:'IBM Plex Sans',sans-serif;font-size:20px;font-weight:300;color:var(--teal);letter-spacing:5px;display:flex;align-items:flex-start;gap:1px} .r-tm{font-size:10px;color:var(--teal);opacity:.7;margin-top:2px;letter-spacing:0} .r-rule{width:148px;height:.75px;background:var(--teal);opacity:.5} .r-sub{font-family:'IBM Plex Sans',sans-serif;font-size:9px;letter-spacing:1px;color:var(--teal);opacity:.65;font-style:italic} .gpp-btn{display:flex;flex-direction:column;align-items:center;gap:3px;cursor:pointer;transition:opacity .15s;border:none;background:none;padding:0} .gpp-btn:hover{opacity:.72} .gpp-word{font-family:'Cinzel',serif;font-size:20px;font-weight:700;letter-spacing:.02em;color:var(--ink)} .gpp-rule{width:180px;height:.75px;background:var(--red);opacity:.6} .gpp-sub{font-family:'IBM Plex Mono',monospace;font-size:7.5px;letter-spacing:2px;color:var(--ink-mid);opacity:.55;text-transform:uppercase} .credit-line{font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.06em;color:var(--ink-light);text-align:center;line-height:1.7} .credit-line a{color:var(--teal);text-decoration:none} .credit-line a:hover{text-decoration:underline} .copyright{font-family:'IBM Plex Mono',monospace;font-size:8px;letter-spacing:.05em;color:#aaa8a0;text-align:center;line-height:1.6} .modal-overlay{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(26,26,24,.72);z-index:999;align-items:center;justify-content:center;padding:16px} .modal-overlay.open{display:flex} .modal{background:var(--paper);border:0.5px solid var(--paper-dark);border-radius:4px;max-width:560px;width:100%;padding:32px 32px 28px;position:relative;max-height:88vh;overflow-y:auto} .modal-close{position:absolute;top:14px;right:16px;background:none;border:.5px solid var(--paper-dark);cursor:pointer;font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-light);padding:4px 10px;border-radius:3px} .modal-close:hover{color:var(--ink);border-color:var(--ink)} .modal-head{margin-bottom:18px;display:flex;align-items:flex-start;gap:3px} .modal-name{font-family:'IBM Plex Sans',sans-serif;font-size:20px;font-weight:300;color:var(--teal);letter-spacing:5px;text-transform:uppercase} .modal-tm{font-size:10px;color:var(--teal);opacity:.65;margin-top:3px} .modal-rule{width:100%;height:.5px;background:var(--paper-dark);margin:18px 0} .modal-section{font-family:'IBM Plex Mono',monospace;font-size:8px;letter-spacing:.14em;text-transform:uppercase;color:var(--teal);margin-bottom:10px;display:block} .modal-body{font-size:13.5px;color:var(--ink-mid);line-height:1.8} .modal-body+.modal-body{margin-top:10px} .modal-pull{border-left:2px solid var(--teal);padding:10px 14px;margin:14px 0;background:rgba(32,178,170,.05)} .modal-pull p{font-size:13px;color:var(--ink-mid);line-height:1.75;font-style:italic} .modal-links{display:flex;gap:12px;flex-wrap:wrap;margin-top:4px} .modal-links a{font-family:'IBM Plex Mono',monospace;font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--teal);text-decoration:none;border-bottom:.5px solid var(--teal);padding-bottom:1px} .modal-links a:hover{opacity:.7} .modal-badge{display:inline-flex;align-items:center;gap:6px;background:#e8f5e8;border:.5px solid #b8dab8;border-radius:3px;padding:5px 10px;margin-top:14px} .modal-badge span{font-family:'IBM Plex Mono',monospace;font-size:8px;letter-spacing:.07em;text-transform:uppercase;color:var(--green)} .modal-tm-note{font-family:'IBM Plex Mono',monospace;font-size:8px;color:#aaa8a0;margin-top:14px;letter-spacing:.04em;line-height:1.6;border-top:.5px solid var(--paper-dark);padding-top:12px} @media(max-width:700px){ .masthead-inner{grid-template-columns:1fr;gap:4px;padding:8px 12px} .masthead-left,.masthead-right{display:none} .region-bar{top:60px;padding:6px 12px} .flag-section,.main-wrap{padding:12px} .marks-row{flex-direction:column;gap:16px} .mark-divider{display:none} }
Free + summary
* State-controlled
~ Partial freedom
Translated
2 sources

Select a country to begin

Live headlines from 66 nations. Click any flag above to load today's top stories.

Save to your home screen

iPhone / iPad (Safari):
Tap the Share button at the bottom of Safari, then tap "Add to Home Screen." Global Press Pass will appear as an icon on your home screen.

Android (Chrome):
Tap the three-dot menu in Chrome, then tap "Add to Home Screen" or "Install App."

Once added, tap the icon any time to open the site instantly in your browser — no app store needed.

globalpresspass.com
// outlet: primary, outlet2: secondary (null if none) const COUNTRIES=[ // ── NORTH AMERICA ── {id:'usa',name:'United States',flag:'🇺🇸',r:'north-america',outlet:'Associated Press',url:'https://apnews.com',outlet2:'Washington Post',url2:'https://www.washingtonpost.com',press:'free',lang:'en',note:''}, {id:'canada',name:'Canada',flag:'🇨🇦',r:'north-america',outlet:'CBC News',url:'https://www.cbc.ca/news',outlet2:'Globe and Mail',url2:'https://www.theglobeandmail.com',press:'free',lang:'en',note:''}, {id:'mexico',name:'Mexico',flag:'🇲🇽',r:'north-america',outlet:'El Universal',url:'https://www.eluniversal.com.mx',outlet2:'Reforma',url2:'https://www.reforma.com',press:'free',lang:'es',note:''}, {id:'jamaica',name:'Jamaica',flag:'🇯🇲',r:'north-america',outlet:'Jamaica Gleaner',url:'https://jamaica-gleaner.com',outlet2:null,url2:null,press:'free',lang:'en',note:''}, {id:'haiti',name:'Haiti',flag:'🇭🇹',r:'north-america',outlet:'Le Nouvelliste',url:'https://lenouvelliste.com',outlet2:null,url2:null,press:'partial',lang:'fr',note:'Press freedom severely compromised by gang violence and political instability. Le Nouvelliste is the oldest and most credible independent Haitian newspaper.'}, // ── SOUTH AMERICA ── {id:'brazil',name:'Brazil',flag:'🇧🇷',r:'south-america',outlet:'Folha de S.Paulo',url:'https://www.folha.uol.com.br',outlet2:'O Globo',url2:'https://oglobo.globo.com',press:'free',lang:'pt',note:''}, {id:'argentina',name:'Argentina',flag:'🇦🇷',r:'south-america',outlet:'La Nacion',url:'https://www.lanacion.com.ar',outlet2:'Clarin',url2:'https://www.clarin.com',press:'free',lang:'es',note:''}, {id:'colombia',name:'Colombia',flag:'🇨🇴',r:'south-america',outlet:'El Tiempo',url:'https://www.eltiempo.com',outlet2:null,url2:null,press:'free',lang:'es',note:''}, {id:'chile',name:'Chile',flag:'🇨🇱',r:'south-america',outlet:'La Tercera',url:'https://www.latercera.com',outlet2:null,url2:null,press:'free',lang:'es',note:''}, {id:'peru',name:'Peru',flag:'🇵🇪',r:'south-america',outlet:'El Comercio',url:'https://elcomercio.pe',outlet2:'La Republica',url2:'https://larepublica.pe',press:'free',lang:'es',note:''}, {id:'venezuela',name:'Venezuela',flag:'🇻🇪',r:'south-america',outlet:'El Nacional',url:'https://www.elnacional.com',outlet2:null,url2:null,press:'partial',lang:'es',note:"Venezuela's independent press faces extreme government pressure, including fines, harassment, and censorship."}, // ── EUROPE ── {id:'uk',name:'United Kingdom',flag:'🇬🇧',r:'europe',outlet:'The Guardian',url:'https://www.theguardian.com',outlet2:'BBC News',url2:'https://www.bbc.com/news',press:'free',lang:'en',note:''}, {id:'germany',name:'Germany',flag:'🇩🇪',r:'europe',outlet:'Der Spiegel',url:'https://www.spiegel.de/international',outlet2:'Frankfurter Allgemeine',url2:'https://www.faz.net/aktuell',press:'free',lang:'de',note:''}, {id:'france',name:'France',flag:'🇫🇷',r:'europe',outlet:'Le Monde',url:'https://www.lemonde.fr',outlet2:'France 24',url2:'https://www.france24.com/en',press:'free',lang:'fr',note:''}, {id:'italy',name:'Italy',flag:'🇮🇹',r:'europe',outlet:'La Repubblica',url:'https://www.repubblica.it',outlet2:'Corriere della Sera',url2:'https://www.corriere.it',press:'free',lang:'it',note:''}, {id:'spain',name:'Spain',flag:'🇪🇸',r:'europe',outlet:'El Pais',url:'https://english.elpais.com',outlet2:'El Mundo',url2:'https://www.elmundo.es',press:'free',lang:'es',note:''}, {id:'russia',name:'Russia',flag:'🇷🇺',r:'europe',outlet:'Meduza (exile)',url:'https://meduza.io/en',outlet2:'Novaya Gazeta (exile)',url2:'https://novayagazeta.ru',press:'state',lang:'ru',note:'Independent press largely exiled since 2022. Meduza and Novaya Gazeta operate from outside Russia. Domestic media is fully state-controlled.'}, {id:'netherlands',name:'Netherlands',flag:'🇳🇱',r:'europe',outlet:'NRC',url:'https://www.nrc.nl',outlet2:'De Volkskrant',url2:'https://www.volkskrant.nl',press:'free',lang:'nl',note:''}, {id:'switzerland',name:'Switzerland',flag:'🇨🇭',r:'europe',outlet:'NZZ',url:'https://www.nzz.ch',outlet2:'Swissinfo',url2:'https://www.swissinfo.ch/eng',press:'free',lang:'de',note:''}, {id:'poland',name:'Poland',flag:'🇵🇱',r:'europe',outlet:'Gazeta Wyborcza',url:'https://wyborcza.pl',outlet2:'TVN24',url2:'https://tvn24.pl',press:'free',lang:'pl',note:''}, {id:'sweden',name:'Sweden',flag:'🇸🇪',r:'europe',outlet:'Dagens Nyheter',url:'https://www.dn.se',outlet2:'The Local Sweden',url2:'https://www.thelocal.se',press:'free',lang:'sv',note:''}, {id:'belgium',name:'Belgium',flag:'🇧🇪',r:'europe',outlet:'Le Soir',url:'https://www.lesoir.be',outlet2:'De Standaard',url2:'https://www.standaard.be',press:'free',lang:'fr',note:''}, {id:'norway',name:'Norway',flag:'🇳🇴',r:'europe',outlet:'Aftenposten',url:'https://www.aftenposten.no',outlet2:'NRK',url2:'https://www.nrk.no',press:'free',lang:'no',note:''}, {id:'austria',name:'Austria',flag:'🇦🇹',r:'europe',outlet:'Der Standard',url:'https://www.derstandard.at',outlet2:'ORF',url2:'https://orf.at',press:'free',lang:'de',note:''}, {id:'ukraine',name:'Ukraine',flag:'🇺🇦',r:'europe',outlet:'Kyiv Independent',url:'https://kyivindependent.com',outlet2:'Ukrainska Pravda',url2:'https://www.pravda.com.ua/eng',press:'partial',lang:'uk',note:'Press freedom has been under severe strain since the Russian invasion of 2022. Both the Kyiv Independent and Ukrainska Pravda are internationally recognized independent outlets.'}, {id:'denmark',name:'Denmark',flag:'🇩🇰',r:'europe',outlet:'Politiken',url:'https://politiken.dk',outlet2:null,url2:null,press:'free',lang:'da',note:''}, // ── AFRICA ── {id:'south-africa',name:'South Africa',flag:'🇿🇦',r:'africa',outlet:'Daily Maverick',url:'https://www.dailymaverick.co.za',outlet2:'Mail and Guardian',url2:'https://mg.co.za',press:'free',lang:'en',note:''}, {id:'nigeria',name:'Nigeria',flag:'🇳🇬',r:'africa',outlet:'The Punch',url:'https://punchng.com',outlet2:'Vanguard',url2:'https://www.vanguardngr.com',press:'free',lang:'en',note:''}, {id:'kenya',name:'Kenya',flag:'🇰🇪',r:'africa',outlet:'Daily Nation',url:'https://nation.africa',outlet2:null,url2:null,press:'free',lang:'en',note:''}, {id:'egypt',name:'Egypt',flag:'🇪🇬',r:'africa',outlet:'Mada Masr',url:'https://www.madamasr.com/en',outlet2:null,url2:null,press:'partial',lang:'ar',note:'Mada Masr is independent but has faced government raids. Press freedom is significantly limited.'}, {id:'ethiopia',name:'Ethiopia',flag:'🇪🇹',r:'africa',outlet:'Addis Standard',url:'https://addisstandard.com',outlet2:null,url2:null,press:'partial',lang:'am',note:'Press freedom under pressure. Several journalists have been detained in recent years.'}, // ── ASIA ── {id:'india',name:'India',flag:'🇮🇳',r:'asia',outlet:'The Hindu',url:'https://www.thehindu.com',outlet2:'The Wire',url2:'https://thewire.in',press:'free',lang:'en',note:''}, {id:'china',name:'China',flag:'🇨🇳',r:'asia',outlet:'China Daily (state)',url:'http://www.chinadaily.com.cn',outlet2:'SCMP',url2:'https://www.scmp.com',press:'state',lang:'zh',note:'Domestic media is state-controlled. China Daily reflects CCP editorial policy. South China Morning Post (SCMP) is Hong Kong-based and offers broader independent coverage.'}, {id:'japan',name:'Japan',flag:'🇯🇵',r:'asia',outlet:'Japan Times',url:'https://www.japantimes.co.jp',outlet2:'Asahi Shimbun',url2:'https://www.asahi.com/ajw',press:'free',lang:'ja',note:''}, {id:'south-korea',name:'South Korea',flag:'🇰🇷',r:'asia',outlet:'Korea Herald',url:'https://www.koreaherald.com',outlet2:'Hankyoreh',url2:'https://english.hani.co.kr',press:'free',lang:'ko',note:''}, {id:'indonesia',name:'Indonesia',flag:'🇮🇩',r:'asia',outlet:'Jakarta Post',url:'https://www.thejakartapost.com',outlet2:'Kompas',url2:'https://www.kompas.com',press:'free',lang:'id',note:''}, {id:'philippines',name:'Philippines',flag:'🇵🇭',r:'asia',outlet:'Rappler',url:'https://www.rappler.com',outlet2:'Philippine Daily Inquirer',url2:'https://www.inquirer.net',press:'free',lang:'en',note:''}, {id:'thailand',name:'Thailand',flag:'🇹🇭',r:'asia',outlet:'Bangkok Post',url:'https://www.bangkokpost.com',outlet2:null,url2:null,press:'partial',lang:'en',note:"Press operates under risk of lese-majeste laws. Self-censorship is common on royal topics."}, {id:'vietnam',name:'Vietnam',flag:'🇻🇳',r:'asia',outlet:'VnExpress Intl.',url:'https://e.vnexpress.net',outlet2:null,url2:null,press:'state',lang:'vi',note:'All media in Vietnam operates under Communist Party control. VnExpress International is the most widely read outlet but reflects state editorial guidelines.'}, {id:'taiwan',name:'Taiwan',flag:'🇹🇼',r:'asia',outlet:'Taipei Times',url:'https://www.taipeitimes.com',outlet2:'Taiwan News',url2:'https://www.taiwannews.com.tw',press:'free',lang:'zh',note:'Taiwan maintains a free and independent press. Its status is disputed internationally but it functions as a separate democratic entity with robust media freedom.'}, {id:'singapore',name:'Singapore',flag:'🇸🇬',r:'asia',outlet:'Straits Times',url:'https://www.straitstimes.com',outlet2:null,url2:null,press:'partial',lang:'en',note:'Press freedom is restricted by government legislation. The Straits Times is the leading English-language newspaper but operates under tight regulatory constraints.'}, {id:'malaysia',name:'Malaysia',flag:'🇲🇾',r:'asia',outlet:'Malaysiakini',url:'https://www.malaysiakini.com',outlet2:null,url2:null,press:'partial',lang:'ms',note:'Malaysiakini is the leading independent digital outlet. Traditional media faces significant political and legal pressure.'}, {id:'bangladesh',name:'Bangladesh',flag:'🇧🇩',r:'asia',outlet:'Daily Star',url:'https://www.thedailystar.net',outlet2:null,url2:null,press:'partial',lang:'en',note:'Press freedom has deteriorated in recent years. The Daily Star is the most credible independent English-language outlet.'}, // ── MIDDLE EAST ── {id:'israel',name:'Israel',flag:'🇮🇱',r:'middle-east',outlet:'Times of Israel',url:'https://www.timesofisrael.com',outlet2:'Haaretz',url2:'https://www.haaretz.com',press:'free',lang:'he',note:''}, {id:'saudi-arabia',name:'Saudi Arabia',flag:'🇸🇦',r:'middle-east',outlet:'Arab News (state)',url:'https://www.arabnews.com',outlet2:null,url2:null,press:'state',lang:'en',note:'Press operates under strict government oversight. Critical coverage of the monarchy is not permitted.'}, {id:'iran',name:'Iran',flag:'🇮🇷',r:'middle-east',outlet:'Iran Intl. (exile)',url:'https://www.iranintl.com/en',outlet2:null,url2:null,press:'state',lang:'fa',note:'Domestic media is fully state-controlled. Iran International is an independent London-based exile outlet publishing in English and Farsi.'}, {id:'uae',name:'UAE',flag:'🇦🇪',r:'middle-east',outlet:'The National',url:'https://www.thenationalnews.com',outlet2:null,url2:null,press:'partial',lang:'en',note:'The National is professional but critical coverage of the government is restricted.'}, {id:'turkey',name:'Turkey',flag:'🇹🇷',r:'middle-east',outlet:'Hurriyet Daily News',url:'https://www.hurriyetdailynews.com',outlet2:'Bianet',url2:'https://bianet.org/english',press:'partial',lang:'en',note:'Press freedom significantly eroded since 2016. Bianet is an independent media outlet recognized by CPJ and RSF for courageous journalism under pressure.'}, // ── OCEANIA ── {id:'australia',name:'Australia',flag:'🇦🇺',r:'oceania',outlet:'Sydney Morning Herald',url:'https://www.smh.com.au',outlet2:'ABC News Australia',url2:'https://www.abc.net.au/news',press:'free',lang:'en',note:''}, {id:'french-polynesia',name:'French Polynesia',flag:'🌺',r:'oceania',outlet:'La Depeche de Tahiti',url:'https://www.depeche.pf',outlet2:null,url2:null,press:'free',lang:'fr',note:''}, {id:'micronesia',name:'Micronesia',flag:'🇫🇲',r:'oceania',outlet:'Pacific Island Times',url:'https://www.pacificislandtimes.com',outlet2:null,url2:null,press:'free',lang:'en',note:''}, {id:'pacific-islands',name:'Pacific Islands',flag:'🌊',r:'oceania',outlet:'RNZ Pacific',url:'https://www.rnz.co.nz/international/pacific-news',outlet2:null,url2:null,press:'free',lang:'en',note:''}, // ── POLAR / REMOTE ── {id:'arctic',name:'Arctic / North Pole',flag:'🧊',r:'polar',outlet:'Arctic Today',url:'https://www.arctictoday.com',outlet2:'Barents Observer',url2:'https://thebarentsobserver.com',press:'free',lang:'en',note:''}, {id:'antarctica',name:'Antarctica',flag:'🐧',r:'polar',outlet:'Antarctic Sun / BAS',url:'https://antarcticsun.usap.gov',outlet2:null,url2:null,press:'free',lang:'en',note:''}, // ── INDIGENOUS ── {id:'indigenous-americas',name:'Indigenous Americas',flag:'🪶',r:'indigenous',outlet:'Indian Country Today',url:'https://indiancountrytoday.com',outlet2:'Indianz.com',url2:'https://www.indianz.com',press:'free',lang:'en',note:'Indian Country Today is the most widely recognized independent Indigenous news source in North America, covering tribal nations across the US and Canada. Founded 1981.'}, ]; let curR='all',selId=null,selOutlet=0,cache={}; const d=new Date(); document.getElementById('live-date').textContent=d.toLocaleDateString('en-US',{weekday:'long',year:'numeric',month:'long',day:'numeric'}).toUpperCase(); document.getElementById('yr').textContent=d.getFullYear(); function buildGrid(){ const g=document.getElementById('fgrid'); g.innerHTML=''; const list=curR==='all'?COUNTRIES:COUNTRIES.filter(c=>c.r===curR); list.forEach(c=>{ const el=document.createElement('div'); el.className='fc'+(selId===c.id?' on':''); el.id='fc-'+c.id; el.setAttribute('role','listitem'); el.setAttribute('aria-label',c.name); el.onclick=()=>pick(c); let badges=''; if(c.press==='state') badges+='*'; else if(c.press==='partial') badges+='~'; el.innerHTML=badges+''+c.name+''; g.appendChild(el); }); } function filterR(r,btn){ curR=r; document.querySelectorAll('.rbtn').forEach(b=>b.classList.remove('on')); btn.classList.add('on'); buildGrid(); } function pick(c){ selId=c.id; selOutlet=0; document.querySelectorAll('.fc').forEach(x=>x.classList.remove('on')); const fc=document.getElementById('fc-'+c.id); if(fc){fc.classList.add('on');fc.scrollIntoView({behavior:'smooth',block:'nearest',inline:'center'});} renderPanel(c,0); const cacheKey=c.id+'_0'; if(cache[cacheKey]) renderArts(c,cache[cacheKey],0); else loadNews(c,0); } function switchOutlet(c,outletIdx){ selOutlet=outletIdx; renderPanel(c,outletIdx); const cacheKey=c.id+'_'+outletIdx; if(cache[cacheKey]) renderArts(c,cache[cacheKey],outletIdx); else loadNews(c,outletIdx); } function renderPanel(c,outletIdx){ const isSecond=outletIdx===1&&c.outlet2; const currentOutlet=isSecond?c.outlet2:c.outlet; const currentUrl=isSecond?c.url2:c.url; let tags=''; if(c.press==='state') tags+='* State media'; else if(c.press==='partial') tags+='~ Partial freedom'; else tags+='✓ Independent'; if(c.lang!=='en') tags+='Translated'; const note=c.note?`
⚠ ${c.note}
`:''; const cacheKey=c.id+'_'+outletIdx; const cnt=cache[cacheKey]?cache[cacheKey].length:'—'; let outletBtns=''; if(c.outlet2){ outletBtns=`
`; } else { outletBtns=`
Source: ${currentOutlet}
`; } document.getElementById('cpanel').innerHTML=`

${c.name}

${outletBtns}
${tags}
${note}
${cnt}Articles
${c.lang}Language
${c.press==='free'?'✓':c.press==='state'?'*':'~'}Press
`; } async function loadNews(c,outletIdx){ const isSecond=outletIdx===1&&c.outlet2; const currentOutlet=isSecond?c.outlet2:c.outlet; const currentUrl=isSecond?c.url2:c.url; document.getElementById('art-area').innerHTML= `
Loading headlines
${c.flag} ${c.name}
`; try{ const resp=await fetch(`${WORKER}/?country=${c.id}`); if(!resp.ok) throw new Error('Request failed ('+resp.status+')'); const data=await resp.json(); if(data.status==='error'||!data.items||!data.items.length) throw new Error(data.error||'No articles found'); const cacheKey=c.id+'_'+outletIdx; cache[cacheKey]=data.items; renderPanel(c,outletIdx); renderArts(c,data.items,outletIdx); }catch(e){ const currentOutletName=outletIdx===1&&c.outlet2?c.outlet2:c.outlet; const currentOutletUrl=outletIdx===1&&c.url2?c.url2:c.url; document.getElementById('art-area').innerHTML= `
Could not load ${c.name}
${e.message}

Visit ${currentOutletName} directly →
`; } } function renderArts(c,items,outletIdx){ const nums=['I','II','III']; const needsTr=c.lang!=='en'; const isSecond=outletIdx===1&&c.outlet2; const currentOutlet=isSecond?c.outlet2:c.outlet; const hdr=`

${c.flag} ${c.name}

via ${currentOutlet}
`; const cards=items.slice(0,3).map((item,i)=>{ const dt=item.publishedAt?new Date(item.publishedAt).toLocaleDateString('en-US',{month:'short',day:'numeric',hour:'2-digit',minute:'2-digit'}):''; const tr=needsTr?`🌐 Translate`:''; const desc=item.description?`
${item.description}
`:''; return `
${nums[i]||i+1}${item.source||currentOutlet}
${dt?``:''}

${desc} Read full article →${tr}
`; }).join(''); document.getElementById('art-area').innerHTML=`
${hdr}${cards}
`; } function openModal(id){document.getElementById('modal-'+id).classList.add('open');document.body.style.overflow='hidden';} function closeModal(id){document.getElementById('modal-'+id).classList.remove('open');document.body.style.overflow='';} function closeOnOverlay(e,id){if(e.target===document.getElementById('modal-'+id))closeModal(id);} function toggleHSModal(){document.getElementById('hs-modal').classList.toggle('open');} document.addEventListener('keydown',e=>{if(e.key==='Escape'){closeModal('rubimby');closeModal('gpp');document.getElementById('hs-modal').classList.remove('open');}}); buildGrid();